iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
Mobile Development

Jetpack Compose 從心開始系列 第 12

Jetpack Compose 從心開始 Day12 - 單向資料流

  • 分享至 

  • xImage
  •  

前言

   在應用程式架構中的UI層,提到了單向資料流 (Unidirectional Data Flow, UDF),那什麼是單向資料流呢?

單向資料流 (Unidirectional Data Flow, UDF)

什麼是單向資料流?

單向資料流是一種設計模式,它將資料在應用程式中的流動限制為單一方向。在 Android 應用程式中,UDF 通常指的是:

  • 狀態來源唯一: 應用程式的狀態只有一個唯一的來源,通常是 ViewModel。
  • 狀態更新單向: 狀態的更新只能從 ViewModel 流向 View,不能從 View 反向修改 ViewModel 的狀態。
  • 事件驅動: View 層產生的使用者事件會被傳遞給 ViewModel,ViewModel 處理這些事件並更新狀態。

為什麼要使用單向資料流?

  • 可預測性: 狀態的變化變得更容易預測和追蹤,減少了 bug 的產生。
  • 可測試性: 將 UI 和邏輯分離,使得單元測試更容易進行。
  • 可維護性: 程式碼結構更清晰,更容易維護。
  • 減少副作用: 避免了狀態的不一致性,提高了應用程式的穩定性。

單向資料流在 Android Jetpack Compose 中的應用

使用單向資料流的應用程式 UI 更新迴圈如下所示:

  • 事件:部分 UI 產生事件並向上傳遞,例如傳遞至 ViewModel 來處理的按鈕點選事件;或是從應用程式的其他層傳遞的事件,例如表示使用者工作階段已過期的指標。
  • 更新狀態:事件處理常式可能會變更狀態。
  • 顯示狀態:狀態容器向下傳遞狀態,然後在 UI 中顯示。

https://ithelp.ithome.com.tw/upload/images/20240921/20121643U5c2KEhshl.png

使用應用程式架構的 UDF 模式會有下列影響:

  • ViewModel 會保留並公開 UI 耗用的狀態。
  • UI 狀態是由 ViewModel 轉換的應用程式資料。
  • UI 會就使用者事件通知 ViewModel。
  • ViewModel 會處理使用者動作並更新狀態。
  • 系統會將更新狀態傳回 UI 以進行算繪。
  • 任何造成狀態變化的事件都會重複此程序。
@Composable
fun MyScreen(viewModel: MyViewModel) {
    val count by viewModel.count.collectAsState()

    Button(onClick = { viewModel.increment() }) {
        Text(text = "Count: $count")
    }
}

class MyViewModel : ViewModel() {
    private val _count = MutableStateFlow(0)
    val count: StateFlow<Int> = _count

    fun increment() {
        _count.value++
    }
}

練習的範例

https://developer.android.com/codelabs/basic-android-kotlin-compose-viewmodel-and-state?hl=zh-tw#0


上一篇
Jetpack Compose 從心開始 Day11 - 建議的應用程式架構
下一篇
Jetpack Compose 從心開始 Day13 - ViewModel 的單元測試
系列文
Jetpack Compose 從心開始30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言